iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
AI & Data

語言學與NLP系列 第 24

Day 24 看不見的手?隱馬可夫模型(Hidden Markov Model)介紹與實作

  • 分享至 

  • xImage
  •  

今天要討論的是隱馬可夫模型(Hidden Markov Model, HMM)。既然名字裡面有馬可夫三個字,想必一定和昨天提到的馬可夫模型、馬可夫鏈有關。其實隱馬可夫模型就是馬可夫鏈的延伸。還記得馬可夫鏈的意義嗎?當一個隨機過程在給定現在狀態及所有過去狀態情況下(連續事件),其未來狀態的條件機率分布僅依賴於當前狀態。也就是說當前狀態取決於前一狀態之內容。這個想法沒錯,但是太過簡單了,會忽略其他事情的影響,在這個過程中有什麼東西被「隱藏」了,卻仍然默默的影響每個狀態。把這些被「隱藏」起來的特徵計算進去就是所謂的隱馬可夫模型。

以昨天的例子來說,小美每天放學時會去買紅茶、珍珠奶茶或咖啡。如果把小美每天買的飲料記錄下來就是她「買飲料」這個事件的馬可夫鏈,這是我們(或小美的同學?)可以觀察的到的現象。然後,我們又依照過去的經驗,得知小美在不同疲憊程度的狀況下買不同飲料的機率,那麼我們是不是就能透過我們已知的觀察和知識,去推測小美的疲憊程度這種隱藏的影響力呢?

在這個例子裡,依照馬可夫鏈的邏輯會有 2 個不同的鏈(序列),一個是我們所觀察得到的,小美每天買的飲料;另一個是我們看不到的(隱藏的),小美的疲憊程度。由於我們知悉這 2 個馬可夫鏈之間的關係,所以我們便可以由其中一個馬可夫鏈的狀態,去預測另一個馬可夫鏈的狀態。所謂「隱馬可夫模型」便是描述這樣兩個序列關係的統計模型。所以說,HMM 就是以「看得到的」連續現象去探究及預測另一個「看不到的」連續現象為目的而產生的模型。

說了那麼多,馬可夫鏈或者 HMM 到底和 NLP 有什麼關聯呢?其實它的運用很廣泛,以最貼近大家生活的語音辨識系統為例好了,它背後運算的理論模型就是 HMM 喔!在語言學上,我們可以把人說話的聲音以音節(syllable)來標記,所以理論上,我們如果有一段錄音,只要能清楚分辨每一個音節發的音是哪些母音與子音,就能夠辨識出這個人所說的話並轉換成文字。然而,事實往往並非如此單純。想想看,實際我們在說話時常常因為偷懶、貪快而將字糊在一團唸過去、中文裡無處不在的同音字、詞、三聲變調(兩個三聲合在一起,第一個三聲會變二聲)、破音字等等都是嚴重的干擾項目。這時候,音節這個「語音項目」只是其中一項變化序列,而這個變化序列受到以上列舉出的這些「隱藏」序列,也就是欲得知的「文字」所影響。所以對語音辨識系統而言,語音這個「音節序列」是看得到的訊號,而語音辨識系統想要做的正好是 HMM 所模擬的狀況,推測出與其相對應看不到的「文字序列」。

除了語音辨識,NLP 常遇到的詞性標記(Part-of-speech tagging)背後也是運用了 HMM。是什麼「文字」是已知的序列,詞性會因為句型、位置、時態等等有所變化,所以我們會透過已知的文字序列背後所包含的所有資訊去推估詞性這個隱藏序列,進而達成詞性標記。

接下來,我們就運用 Python 中的 NLTK 來訓練一個 HMM tagger 吧!

HMM Python 實作


# 把需要用的 packages 裝一裝
import nltk
from nltk.corpus import treebank # treebank 詞性標註語料庫
from nltk.tag import hmm # hmm model
from nltk import word_tokenize # 斷詞系統
nltk.download('treebank')
nltk.download('punkt')


trainer = hmm.HiddenMarkovModelTrainer()
treebank.tagged_sents()[:2] # list Brown corpus 中的前兩個標記句子

執行結果為:
[[('Pierre', 'NNP'),
('Vinken', 'NNP'),
(',', ','),
('61', 'CD'),
('years', 'NNS'),
('old', 'JJ'),
(',', ','),
('will', 'MD'),
('join', 'VB'),
('the', 'DT'),
('board', 'NN'),
('as', 'IN'),
('a', 'DT'),
('nonexecutive', 'JJ'),
('director', 'NN'),
('Nov.', 'NNP'),
('29', 'CD'),
('.', '.')],
[('Mr.', 'NNP'),
('Vinken', 'NNP'),
('is', 'VBZ'),
('chairman', 'NN'),
('of', 'IN'),
('Elsevier', 'NNP'),
('N.V.', 'NNP'),
(',', ','),
('the', 'DT'),
('Dutch', 'NNP'),
('publishing', 'VBG'),
('group', 'NN'),
('.', '.')]]

NLTK HMM 提供監督式和非監督式的訓練方法。在這裡,我們使用 Brown corpus 為 dataset 並以監督式方法來訓練 HMM


tagger = trainer.train_supervised(treebank.tagged_sents())
tagger

執行結果為:
<HiddenMarkovModelTagger 46 states and 12408 output symbols>

接著測試看看斷詞系統是否能夠正常斷詞


word_tokenize("I've learned how to use Brown corpus to train an HMM tagger.")

執行結果為:
['I',
"'ve",
'learned',
'how',
'to',
'use',
'Brown',
'corpus',
'to',
'train',
'an',
'HMM',
'tagger',
'.']

顯然是能夠成功斷詞的,那麼我們做最終的詞性標註。

 
tagger.tag(word_tokenize("I've learned how to use Brown corpus to train an HMM tagger."))
 

執行結果為:
[('I', 'PRP'),
("'ve", 'VBP'),
('learned', 'VBD'),
('how', 'WRB'),
('to', 'JJ'),
('use', 'NN'),
('Brown', 'NNP'),
('corpus', 'NNP'),
('to', 'NNP'),
('train', 'NNP'),
('an', 'NNP'),
('HMM', 'NNP'),
('tagger', 'NNP'),
('.', 'NNP')]

可以看到每個 token 都成功標記出來了!
那麼最後附上 NLTK POS tags 的列表給大家參考~

  • CC coordinating conjunction
  • CD cardinal digit
  • DT determiner
  • EX existential there (like: “there is” … think of it like “there exists”)
  • FW foreign word
  • IN preposition/subordinating conjunction
  • JJ adjective ‘big’
  • JJR adjective, comparative ‘bigger’
  • JJS adjective, superlative ‘biggest’
  • LS list marker 1)
  • MD modal could, will
  • NN noun, singular ‘desk’
  • NNS noun plural ‘desks’
  • NNP proper noun, singular ‘Harrison’
  • NNPS proper noun, plural ‘Americans’
  • PDT predeterminer ‘all the kids’
  • POS possessive ending parent’s
  • PRP personal pronoun I, he, she
  • PRP$ possessive pronoun my, his, hers
  • RB adverb very, silently,
  • RBR adverb, comparative better
  • RBS adverb, superlative best
  • RP particle give up
  • TO, to go ‘to’ the store.
  • UH interjection, errrrrrrrm
  • VB verb, base form take
  • VBD verb, past tense took
  • VBG verb, gerund/present participle taking
  • VBN verb, past participle taken
  • VBP verb, sing. present, non-3d take
  • VBZ verb, 3rd person sing. present takes
  • WDT wh-determiner which
  • WP wh-pronoun who, what
  • WP$ possessive wh-pronoun whose
  • WRB wh-abverb where, when

上一篇
Day 23 馬可夫模型的基礎----馬可夫鏈(Markov Chain)介紹與實作
下一篇
Day 25 NLP 中的 依存句法分析(Dependency Parsing)介紹與實作
系列文
語言學與NLP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言